#ifndef _MUTEX_HPP_
#define _MUTEX_HPP_
#include <iostream>
#include <unistd.h>
#include <pthread.h>



namespace MyMutex
{
    class Mutex
    {
    public:
        Mutex()
        {}
        void Mutex_init()
        {
            pthread_mutex_init(&_mutex,nullptr);
        }

        void Mutex_lock()
        {
            pthread_mutex_lock(&_mutex);
        }

        void Mutex_unlock()
        {
            pthread_mutex_unlock(&_mutex);
        }

        ~Mutex()
        {
            pthread_mutex_destroy(&_mutex);
        }

    private:
        pthread_mutex_t _mutex;
        
    };




    /*-----------------------
    LockGuard这里需要注意，类变量一定要引用，构造也一定要引用
    如果不是引用那么在调用这个函数进行构造的时候，就会对Mutex进行拷贝。拷贝的是一份新的Mutex。跟原来的Mutex不是用一份数据

    在main那边创建了一个Mutex mutex，调用LockGuard时候把mutex传进行，这时候的LockGuard构造是引用，也就是对传递的对象起别名，它不占用新内存空间，使用的是同一个mutex(这是符合我们的预期的)
    如果不是引用，传进来的mutex就是一份新的mutex，我们对该mutex操作并不是对main函数创建的mutex进行操作，这时候加锁和解锁操作不是我们所需要的那把锁
    -----------------------*/
    class LockGuard
    {
    public:
        LockGuard(Mutex& mutex):_mutex(mutex)
        {
            _mutex.Mutex_lock();
        }

        ~LockGuard()
        {
            _mutex.Mutex_unlock();
        }

    private:
        Mutex& _mutex;
    };
}

#endif
